#ifndef A19ED96B_2651_4E5A_B208_F0B1E7C0F10E
#define A19ED96B_2651_4E5A_B208_F0B1E7C0F10E

#include <iostream>
#include <unistd.h>
#include <string>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

const std::string nullpath = "/dev/null";

void Daemon(const std::string& path = "")
{
	//屏蔽信号
	signal(SIGCHLD,SIG_IGN);
	signal(SIGPIPE,SIG_IGN);
	signal(SIGSTOP,SIG_IGN);

	//变成孤儿进程并创建自己的会话
	if(fork() > 0) exit(0);
	setsid();
	
	//标准输入，标准输出，标准错误重定向到fd ----- /dev/null
	int fd = open(nullpath.c_str(),O_RDWR);
	if(fd > 0){
		dup2(fd,0);
		dup2(fd,1);
		dup2(fd,2);
	}
	close(fd);

	if(!path.empty()){
		chdir(path.c_str());
	}
}

#endif /* A19ED96B_2651_4E5A_B208_F0B1E7C0F10E */
